/*
 * PublicTool.h
 *
 *  Created on: 2016-10-20
 *      Author: root
 */

#ifndef PUBLICTOOL_H_
#define PUBLICTOOL_H_
#include"PublicConfig.h"
#ifndef __USE_FILE_OFFSET64
#define __USE_FILE_OFFSET64
#endif
#ifndef __USE_LARGEFILE64
#define __USE_LARGEFILE64
#endif
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#ifdef __MINGW32__
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0701
#endif
#endif
//64位输出
//让__WORDSIZE生效
//定义整数
//尽可能提前防止部分定义被覆盖
#include<stdint.h>
//常用容器,MINGW需放在前面
#include<set>
#include<map>
#include<string>
#include<sys/types.h>
//#include<bits/wordsize.h>
#if __WORDSIZE == 64
#define PRI64 "%ld"
#define PRU64 "%lu"
#else
#define PRI64 "%lld"
#define PRU64 "%llu"
#endif
//#  define INT64_C(c)  c ## LL
//#  define UINT64_C(c) c ## ULL
//常用字符串处理头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//时间结构体相关
//包含time.h timeb.h
#include<sys/time.h>
#if __MINGW32__
#define strcasestr strstr 
#define timersub(a, b, result)						      \
do{									      \
    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;			      \
    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;			      \
    if ((result)->tv_usec < 0) {					      \
      --(result)->tv_sec;						      \
      (result)->tv_usec += 1000000;					      \
    }									      \
}while(0)
//只有1024个字节
ssize_t getline(char**buff,size_t*bufflen,FILE*fp);
#endif
//跟IP相关
#include"PublicIPTool.h"
//目录相关
#include<dirent.h>
//open定义
#include<fcntl.h>
//close定义
#include<unistd.h>
//通用结构体
//typedef std::set<int>       SETIDLIST;//ID队列
typedef std::map<int,int>   MAPIDLIST;
typedef std::map<uint32_t,uint32_t> MAPUINTLIST;
#define SETSTRINGLIST SETIPLIST
#define SETIDLIST   SETPORTLIST
typedef std::map<std::string,std::string>MAPSTRINGLIST;//字符串队列
//日期相关
//2015-03-18 14:26:20
void GetDateTimeString(char*str,size_t len);
//2015-03-18,偏移时间(负数向前，正数向后),flag 0默认,1无-
void GetDateString(char*str,size_t len,time_t seektime=0,int flag=0);
//获取今天日期
int  GetToDay();
//字符串到时间戳,20170301或20170301120000
//bEdn日期格式为当天结束
time_t strtotime(const char*datetime,int bEnd);
//多线程不安全
//时间戳到字符串2015-03-18 14:26:20
char*timetostr(time_t timestamp,char*strtime,size_t maxsize,const char*formnt="%Y-%m-%d %H:%M:%S");
//获取带宽描述,小b
std::string GetBandWidthDescr(uint64_t BandWithd);
//字符串相关
//1全是数字0不是
int  CheckIsAllNumber(const char*str,int len);
//超找指定字符，不区分大小写
const char*strichr(const char*str,char c);
//从指定字符串指定长度中查找字符c的位置
const char*strnchr(const char*str,size_t count,char c);
//去除空格
void TRIMC(char*str,size_t*len);
//字符替换
char*strreplace(char*str,size_t len,char srcch,char dtsch);
//获取key跟value
void GetKeyAndValue(char*key,char*value,char*str);
//去除空格
std::string TRIMCPLUS(std::string str);
//每次都从头匹配 A替换成AB出错
//不推荐使用
std::string& replace_all(std::string&str,const std::string&old_value,const std::string&new_value);
//A替换成AB安全
std::string& replace_all_distinct(std::string&str,const std::string&old_value,const std::string&new_value);
//系统命令相关
//创建目录,recursive为-p
int CreateFolder(const char*path,int recursive);
//1存在，-1不存在 
int is_file_exist(const char*file_path);
int is_dir_exist(const char*dir_path);
//执行目录下脚本
int RunMySh(const char*filename);
#ifndef __MINGW32__
int RunMyShPipe(const char*common,int timeout,std::string&buffer);
#endif
//后台启动
void InitFork();
//定位到当前目录
void InitWorkPath();
//更新属性，部分系统直接获取失败
void UpdateFileType(struct dirent*dirp,const char*Path);
//获取文件大小
int64_t GetFileSize(const char*file);
//获取文件大小描述
std::string GetFileSizeDescr(int64_t filesize);
//获取内存大小
int64_t GetMemSize();
//统一申请内存
void*Malloc(size_t __size,int __c);
void*Free(void*__ptr);
//获取配置文件
const char*GetConfigFileName();
//获取运行文件名
const char*GetAppName();
//获取工作路径
const char*GetWorkPath();
//检测子进程
//必须以NULL结尾
int CheckChildFork(int pid,const char*argv,...);
//事先准备数字列表
//argv[0]需留给内部赋值
int CheckChildForkV(int pid,char*argv[]);
//开始计时 支持16个，默认0
void ReSetStartTime(int flag=0);
//结束计时返回毫秒
int  GetEndTime(int flag=0);
//结束计时返回微秒
int  GetEndTimeEx(int flag=0);
//计算时间差返回毫秒
int GetTimerSubCommon(timeval timeend,timeval timestart);
//计算时间差返回微妙
int GetTimerSubCommonEx(timeval timeend,timeval timestart);
void sleep_s(int nssleeptime);
void usleep_s(int nssleeptime);
//检查是否在报警周期中
bool CheckDuringAlarmTime(int StartHour,int EndHour,const char*Descr);
//一些加密算法
uint32_t MakeCRC32(const char*buff,int len);
#endif /* PUBLICTOOL_H_ */
